RecyclerView源码解析

您所在的位置:网站首页 recyclerview源码 setAdapter RecyclerView源码解析

RecyclerView源码解析

2024-07-01 11:37| 来源: 网络整理| 查看: 265

一、基本用法

RecyclerView作为Google为了取代ListView而推出的更加灵活的列表视图,其使用方法如下: 1.1 在app.gradle中导入以下依赖包

implementation 'com.android.support:recyclerview-v7:29+'

1.2 在main_activity.xml中加入RecyclerView标签

1.3 使用RecyclerView时必须给其设置一个LayoutManager,用户管理RecyclerView的滑动,LayoutManager有LinearLayoutManager、GridLayoutManager等等几种可供用户选择。

public class MainActivity extends AppCompatActivity { RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = findViewById(R.id.recycler); recyclerView.setLayoutManager(new LinearLayoutManager(this){ @Override public int getHeight() { return 0; } }); recyclerView.setAdapter(new MyAdapter(2000)); } class MyAdapter extends RecyclerView.Adapter { private int mCount; public MyAdapter(int count) { mCount = count; } @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.image_layout, parent,false); MyViewHolder viewHolder = new MyViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { holder.tv.setText("hahahhahaha"); holder.tv.setBackgroundColor(getResources().getColor(R.color.black)); holder.iv.setImageResource(R.drawable.ic_launcher_background); return; } @Override public int getItemCount() { return mCount; } } public static class MyViewHolder extends RecyclerView.ViewHolder { private ImageView iv; private TextView tv; public MyViewHolder(View view) { super(view); iv = view.findViewById(R.id.image); tv = view.findViewById(R.id.text); } } }

说明:RecyclerView可以设置以下几个属性 (1)setLayoutManager:必选项,设置 RV 的布局管理器,决定 RV 的显示风格。常用的有线性布局管理器(LinearLayoutManager)、网格布局管理器(GridLayoutManager)、瀑布流布局管理器(StaggeredGridLayoutManager)。

(2)setAdapter:必选项,设置 RV 的数据适配器。当数据发生改变时,以通知者的身份,通知 RV 数据改变进行列表刷新操作。

(3)addItemDecoration:非必选项,设置 RV 中 Item 的装饰器,经常用来设置 Item 的分割线。

(4)setItemAnimator:非必选项,设置 RV 中 Item 的动画。 二、RecyclerView源码解析 2.1 涉及的重要类

ViewHolder Adapter LayoutManager Recycler RecyclerViewPool

上述几个类均是RecyclerView的子类 在这里插入图片描述 (1)Adapter中主要有下面几个方法

public abstract static class Adapter{ //创建ViewHolder,在滑动RecyclerView时,有两种情况,当回收池中有该ViewHolder的缓存,则从回收池中获取ViewHolder,否则调用Adapter的onCreateViewHolder创建指定类型的ViewHolder public abstract VH onCreateViewHolder(@NonNull ViewGroup parent,int viewType); //当通过onCreateViewHolder创建了ViewHolder或者从回收池中获取到了ViewHolder之后,调用onBindViewHolder初始化ViewHolder public abstract void onBindViewHolder(@NonNull VH holder,int position); //控制RecyclerView中Item的数量 public abstract int getItemCount(); //获取指定位置Item的ViewHolder类型 public int getItemViewType(int position){ return 0; } }

(2)ViewHolder只要作用时封装RecyclerView中Item显示的View和其类型mItemType

public abstract static class ViewHolder{ //存放layout自定义View public int mItemType; public View mView; public ViewHolder(View view,int itemType){ mView = view; mItemType = itemType; } public ViewHolder(View view) { } public int getItemType() { return mItemType; } public void setItemType(int mItemType) { this.mItemType = mItemType; } public View getView() { return mView; } public void setView(View mView) { this.mView = mView; } }

(3)Recycler中封装了回收池RecyclerViewPool,可以从Recycler获取到回收池

public final class Recycler{ private RecyclerViewPool mRecyclerPool; public RecyclerViewPool getRecyclerViewPool(){ if(mRecyclerPool == null){ mRecyclerPool = null; } return mRecyclerPool; } }

(4)RecyclerViewPool回收池,可以从下面代码中看到,实际上它是一个“二维数组”,但并非二维数组。RecyclerViewPool中定义了稀疏数组SparseArray用于存放ScrapData,而ScrapData定义了ArrayList用于存放ViewHolder。由于RecyclerView的Item支持不同各式各样的Item,因此RecyclerView,给每种ViewHolder创建了一个ScrapData用于。 稀疏数组的数据结构此处不讲,通过ViewHolder的Type将其放在SparseArray对用的索引处。

public static class RecyclerViewPool{ //限制每种ViewHolder回收池的容量 private static final int DEFAULT_MAX_SCRAP = 5; static class ScrapData{ final ArrayList mScrapHeap = new ArrayList(); int mMaxScrap = DEFAULT_MAX_SCRAP; } SparseArray mScrap = new SparseArray(); public ViewHolder getRecyclerView(int viewType){ ScrapData scrapData = mScrap.get(viewType); if(scrapData != null && scrapData.mScrapHeap


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3